From e7284c23da13686156aa0eb7981374889032c40c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 2 Apr 2021 21:38:14 -0400 Subject: [PATCH] inspector: Support copying nodes to clipboard Add a button that copies the serialization of the selected node to the clipboard. --- gtk/inspector/recorder.c | 32 +++++++++++++++++++++++++++++++- gtk/inspector/recorder.ui | 9 +++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/gtk/inspector/recorder.c b/gtk/inspector/recorder.c index c8042ca580..7b3ead81ee 100644 --- a/gtk/inspector/recorder.c +++ b/gtk/inspector/recorder.c @@ -66,6 +66,7 @@ struct _GtkInspectorRecorder GtkWidget *render_node_view; GtkWidget *render_node_list; GtkWidget *render_node_save_button; + GtkWidget *render_node_clip_button; GtkWidget *node_property_tree; GtkTreeModel *render_node_properties; @@ -1168,12 +1169,15 @@ render_node_list_selection_changed (GtkListBox *list, GtkTreeListRow *row_item; row_item = gtk_single_selection_get_selected_item (recorder->render_node_selection); + + gtk_widget_set_sensitive (recorder->render_node_save_button, row_item != NULL); + gtk_widget_set_sensitive (recorder->render_node_clip_button, row_item != NULL); + if (row_item == NULL) return; paintable = gtk_tree_list_row_get_item (row_item); - gtk_widget_set_sensitive (recorder->render_node_save_button, TRUE); gtk_picture_set_paintable (GTK_PICTURE (recorder->render_node_view), paintable); node = gtk_render_node_paintable_get_render_node (GTK_RENDER_NODE_PAINTABLE (paintable)); populate_render_node_properties (GTK_LIST_STORE (recorder->render_node_properties), node); @@ -1252,6 +1256,30 @@ render_node_save (GtkButton *button, gtk_widget_show (dialog); } +static void +render_node_clip (GtkButton *button, + GtkInspectorRecorder *recorder) +{ + GskRenderNode *node; + GdkClipboard *clipboard; + GBytes *bytes; + GdkContentProvider *content; + + node = get_selected_node (recorder); + if (node == NULL) + return; + + bytes = gsk_render_node_serialize (node); + content = gdk_content_provider_new_for_bytes ("text/plain;charset=utf-8", bytes); + + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (recorder)); + + gdk_clipboard_set_content (clipboard, content); + + g_object_unref (content); + g_bytes_unref (bytes); +} + static void toggle_dark_mode (GtkToggleButton *button, GParamSpec *pspec, @@ -1460,11 +1488,13 @@ gtk_inspector_recorder_class_init (GtkInspectorRecorderClass *klass) gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, render_node_view); gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, render_node_list); gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, render_node_save_button); + gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, render_node_clip_button); gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, node_property_tree); gtk_widget_class_bind_template_callback (widget_class, recordings_clear_all); gtk_widget_class_bind_template_callback (widget_class, recordings_list_row_selected); gtk_widget_class_bind_template_callback (widget_class, render_node_save); + gtk_widget_class_bind_template_callback (widget_class, render_node_clip); gtk_widget_class_bind_template_callback (widget_class, node_property_activated); gtk_widget_class_bind_template_callback (widget_class, toggle_dark_mode); diff --git a/gtk/inspector/recorder.ui b/gtk/inspector/recorder.ui index d2c932410d..de0d7cd9f3 100644 --- a/gtk/inspector/recorder.ui +++ b/gtk/inspector/recorder.ui @@ -54,6 +54,15 @@ + + + 0 + 0 + edit-copy-symbolic + Copy to clipboard + + + -- 2.30.2